package com.cup.wx.micro.web;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.cup.wx.micro.util.WebchatUtil;


/**
 * @Title:  微信信息模块回调
 * @author: alan.deyu.zhao
 * @date:   Jan 4, 2019
 */
@RestController
@RequestMapping("wxmsg/callback")
public class WxMsgCallbackApi {
	
	private Logger logger = LoggerFactory.getLogger(WxMsgCallbackApi.class);
	
	/**
	 * 接收普通消息
	 * @param request
	 */
	@RequestMapping("get")
	public void get(HttpServletRequest request){
		/**
		 *  ToUserName	  	开发者微信号
		 *	FromUserName	发送方帐号（一个OpenID）
		 *	CreateTime		消息创建时间 （整型）
		 *	MsgType			text 文本消息/  image 图片消息 /voice 语音消息 / video 视频消息
		 *					shortvideo 小视频消息location 地理位置消息 / link 链接消息
		 *	Content			文本消息内容
		 *	MsgId			消息id，64位整型
		 *  -------------------------------------------------------------------------
		 *  PicUrl			图片链接（由系统生成）
		 *	MediaId			视频/图片/语音 消息媒体id，可以调用多媒体文件下载接口拉取数据。
		 *  -------------------------------------------------------------------------
		 *  Format			语音格式，如amr，speex等
		 *  -------------------------------------------------------------------------
		 *  ThumbMediaId	视频消息缩略图的媒体id，可以调用多媒体文件下载接口拉取数据。
		 *  -------------------------------------------------------------------------
		 *  Location_X		地理位置维度
		 *	Location_Y		地理位置经度
		 *	Scale			地图缩放大小
		 *	Label			地理位置信息
		 *  -------------------------------------------------------------------------
		 *	Title			消息标题
		 *	Description		消息描述
		 *	Url				消息链接
		 */
		
		Map<String, String> xmlToMap = readRequest(request);
		
		if(xmlToMap == null){
			logger.error("接收普通消息接口解析参数失败！");
			return;
		}
	}
	
	/**
	 * 接收事件推送
	 * @param request
	 */
	@RequestMapping("event")
	public void getevent(HttpServletRequest request){
		
		/**
		 *  ToUserName			开发者微信号
		 *	FromUserName		发送方帐号（一个OpenID）
		 *	CreateTime			消息创建时间 （整型）
		 *	MsgType				消息类型，event
		 *	Event				事件类型：
		 *						1.subscribe 用户未关注时，进行关注后的事件推送
		 *						2.SCAN 用户已关注时的事件推送
		 *						3.LOCATION 上报地理位置事件
		 *						4.CLICK 点击菜单拉取消息时的事件推送
		 *						5.VIEW 点击菜单跳转链接时的事件推送
		 *	EventKey			事件KEY值，qrscene_为前缀，后面为二维码的参数值
		 *	Ticket				二维码的ticket，可用来换取二维码图片
		 *  -------------------------------------------------------------------------	
		 *  Latitude			地理位置纬度
		 *  Longitude			地理位置经度
		 *  Precision			地理位置精度
		 */
		
		Map<String, String> xmlToMap = readRequest(request);
		
		if(xmlToMap == null){
			logger.error("接收事件推送接口解析参数失败！");
			return;
		}
	}
	
	/**
	 * 模板消息事件推送
	 * @param request
	 * @throws Exception
	 */
	@RequestMapping("templatemsg")
	public void templateMsgEventCallback(HttpServletRequest request){
		/**
		 *  ToUserName		公众号微信号
		 *	FromUserName	接收模板消息的用户的openid
		 *	CreateTime		创建时间
		 *	MsgType			消息类型是事件
		 *	Event			事件为模板消息发送结束
		 *	MsgID			消息id
		 *	Status			发送状态
		 */
			
		Map<String, String> xmlToMap = readRequest(request);
		
		if(xmlToMap == null){
			logger.error("模板消息事件推送接口解析参数失败！");
			return;
		}
		
		if("success".equals(xmlToMap.get("Status").toString())){
			// 成功
		}else if("failed:user block".equals(xmlToMap.get("Status").toString())){
			// 用户拒收
		}else if("failed: system failed".equals(xmlToMap.get("Status").toString())){
			// 其他原因送达失败
		}
		// TODO insert database
			
	}
	
	/**
	 * 读取返回内容并转map
	 * @param request
	 * @return
	 */
	private Map<String, String> readRequest(HttpServletRequest request){
		// 
		Map<String, String> xmlToMap = null;
		try {
			String responseXml = "";
			String inputLine;
			while ((inputLine = request.getReader().readLine()) != null) {
				responseXml = responseXml + inputLine;
			}
			request.getReader().close();
			xmlToMap = WebchatUtil.xmlToMap(responseXml);
		} catch (Exception e) {
			
		}
		
		return xmlToMap;
	}
}